# -*- coding: UTF-8 -*-
# 切片: 
def testSlice():
    print("\n----testSlice----\n")
    L = ["Mike","Sarah","Tracy"]
    # L[0:3]
    print("取前三个元素：",L[:3])
    print("倒着取前三个元素：",L[-4:])
    L = range(100)
    print("每5个数，去一个值：",L[::5])
    print("复制一个list：",L[:])

# 迭代：
from collections import Iterable
def testIteration():
    print("\n----testIteration----\n")
    print("判断是否为迭代对象类型")
    print("str : ",isinstance("abc",Iterable))
    print("lsit : ",isinstance(range(3),Iterable))
    print("int : ",isinstance(123,Iterable))
    # enumate: 可以把一个list变成索引-元素对，这样就可以在for循环中同时迭代索引和元素本身
    for i,value in enumerate(["A","B","C"]):
        print(i,value)

# 列表生成器
def testListBuilder():
    print("\n----testListBuilder----\n")
    L = [x*x for x in range(1,11)]
    print("L:",L)
    print("输出偶数平方L:",[x*x for x in range(1,11) if x % 2 == 0])
    # dict : items()可以同时迭代key和value
    d = {"x":"A","y":"B","z":"C"}
    print("L:",[k + "="+value for k,value in d.items()])
    L = ["Hello","World",18,"Apple","None"]
    Ltemp = [x.lower() for x in L if isinstance(x,str)]
    print("Ltemp:",Ltemp)

# Generator: 生成器，如果列表元素可以按照某种算法推算出来，那我们是否可以在循环的过程中不断推算出后续的元素呢？
# 这样就不必创建完整的list，从而节省大量的空间。在Python中，这种一边循环一边计算的机制
def testGenerator():
    g = (x*x for x in range(1,11))
    print("把一个列表生成式的[]改成()，就创建了一个generator:",g)
    for x in g:
        print(x)
    print("yield 方式创建generator")
    # yield: generator和函数的执行流程不一样。函数是顺序执行，遇到return语句或者最后一行函数语句就返回。而变成generator的函数，在每次调用next()的时候执行，遇到yield语句返回，再次执行时从上次返回的yield语句处继续执行。
    print("斐波拉切数：fib(6)：")
    for x in fib(6):
        print(x)
def fib(max):
    n,a,b = 0,0,1
    while n < max:
        yield b
        a,b = b,a+b
        n= n+1 
if __name__ == "__main__":
    testSlice()
    testIteration()
    testListBuilder()
    testGenerator()